package service;

import java.awt.Color;

import presentation.MainFrame;
import presentation.ShowItem;
import core.Bank;
import core.Chance;
import core.Company;
import core.Item;
import core.Jail;
import core.Parking;
import core.Player;
import core.Police;
import core.Property;
import core.Railway;
import core.Start;
import core.Surprise;
import core.Tax;
/**
 * A játék lebonyolításáért felelós osztály.
 * 
 * @author Szabolcs
 *
 */
public class MonopolyService {
	/**
	 * a megjelenítendő elemek
	 */
	ShowItem[] showItems;
	/**
	 * a játékosok száma
	 */
	int nrOfPlayers = 4;
	/**
	 * a bank
	 */
	Bank bank;
	/**
	 * a játékosok tömbje
	 */
	Player[] players;
	/**
	 * az elemek absztraktabb formája
	 */
	Item[] items = new Item[40]; // gygygygygygyg
	/**
	 * az elemek lehetséges színei
	 */
	Color[] colors = new Color[10];
	/**
	 * az épp aktuális játékos indexe
	 */
	int currentPlayer = 3;
	/**
	 * a játékosok pályán elfoglalt pozíciója
	 */
	int[] counters = new int[4];
	/**
	 * a játékosok nevei
	 */
	String[] names = new String[4];

	/**
	 * Inicializálja a színeket, a neveket,
	 * valamint legenerálja a játékosok és az elemek tömbjét. 
	 */
	public MonopolyService() {
		colors[0] = new Color(139, 69, 19);
		colors[1] = new Color(135, 206, 250);
		colors[2] = new Color(255, 20, 147);
		colors[3] = new Color(255, 140, 0);
		colors[4] = new Color(255, 0, 0);
		colors[5] = new Color(255, 215, 0);
		colors[6] = new Color(34, 139, 34);
		colors[7] = new Color(65, 105, 225);
		colors[8] = new Color(127, 127, 127);
		colors[9] = new Color(255, 255, 255);

		names[0] = new String("John");
		names[1] = new String("Pam");
		names[2] = new String("Greg");
		names[3] = new String("Jil");

		generateItems();
		generatePlayers();

		MainFrame f = new MainFrame(this);
		f.setBounds(50, 50, 1000, 650);
		f.setVisible(true);
		f.setResizable(false);
	}

	/**
	 * A belépési pont
	 * @param args paraméterek
	 */
	public static void main(String[] args) {
		MonopolyService ms = new MonopolyService();
	}

	/**
	 * Beállítja a játékosok neveinek szánt mezőket.
	 * 
	 * @param nr a játékosok száma
	 * @param n1 1. játékos neve
	 * @param n2 2. játékos neve
	 * @param n3 3. játékos neve
	 * @param n4 4. játékos neve
	 */
	public void setPlayerNames(int nr, String n1, String n2, String n3,
			String n4) {
		nrOfPlayers = nr;
		names[0] = n1;
		names[1] = n2;
		names[2] = n3;
		names[3] = n4;
		setNames();
		currentPlayer = nrOfPlayers - 1;
	}
	/**
	 * Beállítja a játékosok neveit.
	 */
	private void setNames() {
		if (players != null)
			for (int i = 0; i < nrOfPlayers; ++i)
				if (players[i] != null)
					players[i].setName(names[i]);
	}

	/**
	 * 
	 * @return téríti az elemek tömbjét
	 */
	public Item[] getItems() {
		return items;
	}

	/**
	 * Legenerálja az elemek tömbjét.
	 */
	private void generateItems() {
		items[0] = new Start();
		items[1] = new Property("Piac tér", 60, 0, 2, 50, 2, 10, 30, 90, 160,
				250);
		items[2] = new Surprise();
		items[3] = new Property("Török udvar", 60, 0, 2, 50, 4, 20, 60, 180,
				320, 450);
		items[4] = new Tax(200);
		items[5] = new Railway("Északi vasút", 200, 8, 4, 25, 50, 100, 200);
		items[6] = new Property("Nagykőrösi út", 100, 1, 3, 50, 6, 30, 90, 270,
				400, 550);
		items[7] = new Chance();
		items[8] = new Property("Lestár tér", 100, 1, 3, 50, 6, 30, 60, 270,
				500, 550);
		items[9] = new Property("Kisfaludy út", 120, 1, 3, 60, 8, 40, 100, 300,
				450, 600);
		items[10] = new Jail();
		items[11] = new Property("Egyetem utca", 140, 2, 3, 100, 10, 50, 150,
				450, 625, 750);
		items[12] = new Company("Elektromos t.", 150, 9, 2);
		items[13] = new Property("Színház tér", 140, 2, 3, 100, 10, 50, 150,
				450, 625, 750);
		items[14] = new Property("Janus Pannonius út", 160, 2, 3, 100, 12, 60,
				180, 500, 700, 900);
		items[15] = new Railway("Keleti vasút", 200, 8, 4, 25, 50, 100, 200);
		items[16] = new Property("Petőfi tér", 180, 3, 3, 100, 14, 70, 200,
				550, 750, 950);
		items[17] = new Surprise();
		items[18] = new Property("Nagyerdő", 180, 3, 3, 100, 14, 70, 200, 550,
				750, 950);
		items[19] = new Property("Bethlen utca", 200, 3, 3, 100, 16, 80, 220,
				600, 800, 1000);
		items[20] = new Parking();
		items[21] = new Property("Móra park", 220, 4, 3, 150, 18, 90, 250, 700,
				875, 1050);
		items[22] = new Chance();
		items[23] = new Property("Oskola utca", 220, 4, 3, 150, 18, 90, 250,
				700, 875, 1050);
		items[24] = new Property("Dóm tér", 240, 4, 3, 150, 20, 100, 300, 750,
				925, 1100);
		items[25] = new Railway("Déli vasút", 200, 8, 4, 25, 50, 100, 200);
		items[26] = new Property("Dobó tér", 260, 5, 3, 150, 22, 110, 330, 800,
				975, 1150);
		items[27] = new Property("Almagyar utca", 260, 5, 3, 150, 22, 110, 330,
				800, 975, 1150);
		items[28] = new Company("Vízmű t.", 150, 9, 2);
		items[29] = new Property("Gárdonyi út", 280, 5, 3, 150, 24, 120, 360,
				850, 1025, 1200);
		items[30] = new Police();
		items[31] = new Property("Kőfaragó tér", 300, 6, 3, 200, 26, 130, 390,
				900, 1100, 1275);
		items[32] = new Property("Óváros", 300, 6, 3, 200, 26, 130, 390, 900,
				1100, 1275);
		items[33] = new Surprise();
		items[34] = new Property("Ötvös utca", 320, 6, 3, 200, 28, 150, 450,
				1000, 1200, 1400);
		items[35] = new Railway("Nyugati vasút", 200, 8, 4, 25, 50, 100, 200);
		items[36] = new Chance();
		items[37] = new Property("Vörösmarty tér", 350, 7, 2, 200, 35, 175,
				500, 1100, 1300, 1500);
		items[38] = new Tax(100);
		items[39] = new Property("Dunakorzó", 400, 7, 2, 200, 50, 200, 600,
				1400, 1700, 2000);
	}

	/**
	 * Legenerálja a játékosokat.
	 */
	private void generatePlayers() {
		players = new Player[nrOfPlayers];
		for (int i = 0; i < nrOfPlayers; ++i) {
			players[i] = new Player(names[i], 1500);
		}
	}
	/**
	 * 
	 * @param g egy adott csoport kódja
	 * @return téríti az adott csoporthoz tartozó színt
	 */
	public Color getGroupColor(int g) {
		if (g >= 0 && g < 10)
			return colors[g];
		else
			return Color.WHITE;
	}

	/**
	 * Vált a következő játékosra
	 * @return téríti a játékos nevét
	 */
	public String nextPlayer() {
		currentPlayer = (currentPlayer + 1) % nrOfPlayers;
		return players[currentPlayer].getName();

	}

	/**
	 * Dob a kockákkal.
	 * 
	 * @return téríti a dobott értéket.
	 */
	public int throwDice() {
		players[currentPlayer].throwDice();
		if (players[currentPlayer].isDoubleThrow())
			return -players[currentPlayer].getThrownValue();
		else
			return players[currentPlayer].getThrownValue();
	}

	/**
	 * Megtesz bizonyos számú lépést.
	 * 
	 * @param m lépésszám
	 * @return téríti a mező sorszámát, amire érkezett
	 */
	public int step(int m) {
		return (counters[currentPlayer] = (counters[currentPlayer] + m) % 40);
	}

	/**
	 * Vásárol egy elemet a banktól.
	 * 
	 * @param i az elemre mutató referencia
	 * @return visszatéríti ha sikeres volt a művelet
	 */
	public boolean buyFromBank(Item i) {
		return players[currentPlayer].buyItem(i);
	}

	public void setShowItems(ShowItem[] si) {
		showItems = si;
	}

	/**
	 * Atfesti a birtokolt mezoket.
	 */
	public void paintItems() {
		for (int i = 0; i < 40; ++i) {
			if (showItems[i].getItem().getOwner() == players[currentPlayer])
				showItems[i].mark();
		}
	}

	/**
	 * Visszaalakitja a biztokolt mezoket.
	 */
	public void unpaintItems() {
		for (int i = 0; i < 40; ++i) {
			if (showItems[i].getItem().getOwner() == players[currentPlayer])
				showItems[i].unmark();
		}
	}

	/**
	 * 
	 * @return téríti az aktuális játékos pénzét
	 */
	public int getMoney() {
		return players[currentPlayer].getMoney();
	}
}
